home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / VObjectTView.C < prev    next >
C/C++ Source or Header  |  1990-12-20  |  8KB  |  309 lines

  1. //$VObjectTextView,StretchWrapper, StretchWrapperStretcher$
  2.  
  3. #include "VObjectTView.h"
  4. #include "VObjectText.h"
  5. #include "Clipper.h"
  6.  
  7. //----- VObjectTextView ---------------------------------------------------
  8.  
  9. MetaImpl(VObjectTextView, (TP(kbdFocus), 0));
  10.  
  11. VObjectTextView::VObjectTextView(EvtHandler *eh, Rectangle r, VObjectText *t, eTextJust m, eSpacing sp, 
  12.                bool doWrap, TextViewFlags fl, Point b, int id)
  13.                     : TextView(eh,r,t,m,sp,doWrap,fl,b,id) 
  14. {
  15.     kbdFocus= 0;
  16.     t->SetView(this);
  17. }
  18.  
  19. static VObject *overaVObject= 0;
  20.  
  21. Command *VObjectTextView::DispatchEvents(Point lp, Token t, Clipper *vf) 
  22. {
  23.     VObject *vop= overaVObject= ((VObjectText*)GetText())->ContainsPoint(lp);
  24.     if (t.Code != eEvtLeftButton && t.Code != eEvtMiddleButton) {
  25.     if (kbdFocus && kbdFocus->Enabled()) 
  26.         return kbdFocus->DispatchEvents(lp, t, vf);
  27.     return TextView::DispatchEvents(lp, t, vf);
  28.     }
  29.     
  30.     if (kbdFocus == 0) {
  31.     if (vop) {
  32.         if (vop->WantsKbdFocus()) {
  33.         SetNoSelection();
  34.         kbdFocus= vop;
  35.         kbdFocus->SendDown(cIdStartKbdFocus, cPartFocusChanged, 0);
  36.         }
  37.         return vop->DispatchEvents(lp, t, vf);
  38.     }
  39.     return TextView::DispatchEvents(lp, t, vf);
  40.     } else {
  41.     if (vop) {
  42.         if (vop->WantsKbdFocus()) {
  43.         if (vop != kbdFocus) {
  44.             kbdFocus->SendDown(cIdEndKbdFocus, cPartFocusChanged, 0);
  45.             kbdFocus= vop;
  46.             kbdFocus->SendDown(cIdStartKbdFocus, cPartFocusChanged, 0);
  47.         }
  48.         }
  49.         return vop->DispatchEvents(lp, t, vf);
  50.     }
  51.     kbdFocus->SendDown(cIdEndKbdFocus, cPartFocusChanged, 0);
  52.     kbdFocus= 0;
  53.     return TextView::DispatchEvents(lp, t, vf);
  54.     }
  55. }
  56.  
  57. GrCursor VObjectTextView::GetCursor(Point)
  58. {
  59.     if (overaVObject)
  60.     return eCrsBoldArrow;
  61.     return eCrsIBeam;
  62. }
  63.  
  64. void VObjectTextView::Control(int id, int part, void *val)
  65. {
  66.     if (part == cPartExtentChanged) 
  67.     ((VObjectText*)GetText())->VObjectChangedSize((VObject*)val);
  68.     else
  69.     TextView::Control(id, part, val);
  70. }
  71.  
  72. void VObjectTextView::SetOrigin(Point p)
  73. {
  74.      if (p != GetOrigin()) {
  75.     TextView::SetOrigin(p);
  76.     InvalidateVObjects(0, NumberOfLines()-1);
  77.      }
  78. }
  79.  
  80. void VObjectTextView::InvalidateRange(int from, int to)
  81. {
  82.     TextView::InvalidateRange(from,to);
  83.     InvalidateVObjects(from, to);
  84. }
  85.  
  86. void VObjectTextView::InvalidateRange(int from, Point fp, int to, Point tp)
  87. {
  88.     TextView::InvalidateRange(from, fp, to, tp);
  89.     InvalidateVObjects(from, to);
  90. }
  91.  
  92. void VObjectTextView::InvalidateVObjects(int from, int to)
  93. {
  94.     //---- invalidates the contained VObjects by setting the origin
  95.     //     to -cMaxInt. VObjectText::Draw will position them on demand
  96.     //     e.g. when they are drawn
  97.     VObjectText *t= (VObjectText*)GetText();    
  98.     if (!t->VObjectCount())
  99.     return;
  100.     int start= StartLine(max(from,0)),
  101.     end= EndLine(to);
  102.     Iterator *next= t->VObjectIterator();
  103.     VObjectMark *m;
  104.     while (m= (VObjectMark*)(*next)())
  105.     if (m->Pos() >= start && m->Pos() <= end) 
  106.         m->Invalidate();
  107.     SafeDelete(next);    
  108. }
  109.  
  110. istream& VObjectTextView::ReadFrom(istream &s)
  111. {
  112.     TextView::ReadFrom(s);
  113.     ((VObjectText*)GetText())->SetView(this);
  114.     return s;   
  115. }
  116.  
  117. Text *VObjectTextView::SetText(Text *newText)
  118. {
  119.     Text *ot= TextView::SetText(newText);
  120.     kbdFocus= 0;
  121.     if (newText->IsKindOf(VObjectText)) 
  122.     ((VObjectText*)newText)->SetView(this);
  123.     else
  124.     Error("SetText", "only accepts VObjectTexts");
  125.     return ot;
  126. }
  127.  
  128. //---- StretchWrapperStretcher ------------------------------------------------
  129.  
  130. class StretchWrapperStretcher: public Command {
  131.     Point newExtent, oldExtent;
  132.     class VObject *vob;
  133.     Rectangle maxRect;
  134. public:
  135.     StretchWrapperStretcher(VObject *v);
  136.     Command *TrackMouse(TrackPhase, Point, Point, Point);
  137.     void TrackFeedback(Point ap, Point pp, bool);
  138.     void TrackConstrain(Point, Point, Point *);
  139.     void DoIt();
  140.     void UndoIt();
  141. };
  142.  
  143. StretchWrapperStretcher::StretchWrapperStretcher(VObject *v) : Command(1212, "change extent")
  144. {
  145.     vob= v;
  146.     View *vp= vob->GetView();
  147.     if (vp->IsKindOf(StaticTextView)) {
  148.     StaticTextView *stv= (StaticTextView*)vp;
  149.     maxRect= Rectangle(stv->GetInnerOrigin(), stv->GetInnerExtent());
  150.     } else
  151.     maxRect= vob->GetView()->ContentRect();
  152. }
  153.  
  154. Command *StretchWrapperStretcher::TrackMouse(TrackPhase tp, Point, Point, Point np)
  155. {
  156.     if (tp == eTrackRelease) {
  157.     newExtent= np - vob->GetOrigin();
  158.     oldExtent= vob->GetExtent();
  159.     if (oldExtent == newExtent)
  160.         return gNoChanges;
  161.     return this;
  162.     }
  163.     return this;
  164. }
  165.  
  166. void StretchWrapperStretcher::TrackFeedback(Point, Point pp, bool)
  167. {
  168.     GrStrokeRect(NormRect(vob->GetOrigin(), pp));
  169. }
  170.  
  171. void StretchWrapperStretcher::TrackConstrain(Point, Point, Point *np)
  172. {    
  173.     *np= Max(vob->GetOrigin()+ vob->GetMinSize().Extent(), *np);
  174.     Rectangle r1, r= NormRect(vob->GetOrigin(), *np);
  175.     r1= r.Intersect(maxRect);
  176.     *np= r1.SE();
  177. }
  178.  
  179. void StretchWrapperStretcher::DoIt()
  180. {
  181.     vob->SetExtent(newExtent);
  182. }
  183.  
  184. void StretchWrapperStretcher::UndoIt()
  185. {
  186.     vob->SetExtent(oldExtent);
  187. }
  188.  
  189. //---- StretchWrapper ---------------------------------------------------------
  190.  
  191. MetaImpl(StretchWrapper, (T(interiorOffset), T(extentDiff), T(border), TP(interior)));
  192.  
  193. StretchWrapper::StretchWrapper(VObject *in, Point b, int id) 
  194.                             :CompositeVObject(id, in, 0)
  195. {
  196.     SetFlag(eVObjKbdFocus);
  197.     kbdFocus= FALSE;
  198.     interior= in;
  199.     if (interior->IsKindOf(View))
  200.     ((View*)interior)->SetNextHandler(this);
  201.     border= Max(Point(4,4),b);
  202. }
  203.  
  204. Metric StretchWrapper::GetMinSize()
  205. {
  206.     interiorOffset= border;
  207.     extentDiff= 2*interiorOffset;
  208.     Metric m= interior->GetMinSize();
  209.     return m.Expand(border);
  210. }
  211.  
  212. void StretchWrapper::SetOrigin(Point at)
  213. {
  214.     VObject::SetOrigin(at);
  215.     interior->SetOrigin(at+interiorOffset);
  216. }
  217.  
  218. void StretchWrapper::SetExtent(Point e)
  219. {
  220.     VObject::SetExtent(e);
  221.     e-= extentDiff;
  222.     interior->SetExtent(e);
  223. }
  224.  
  225. Command *StretchWrapper::DoLeftButtonDownCommand(Point p, Token, int)
  226. {
  227.     Rectangle r(ContentRect().SE()-gPoint8, gPoint8);
  228.    
  229.     if (r.ContainsPoint(p)) 
  230.     return new StretchWrapperStretcher(this);
  231.     return gNoChanges;
  232. }
  233.  
  234. Command *StretchWrapper::DoKeyCommand(int, Point, Token)
  235. {
  236.     return gNoChanges;
  237. }
  238.  
  239. void StretchWrapper::Control(int id, int part, void *val)
  240. {
  241.     if (part == cPartExtentChanged && val == interior) {
  242.     VObject *vop= (VObject*)val;
  243.     if (interior->GetExtent() != GetExtent()+extentDiff) // change from inside
  244.         SetExtent(interior->GetExtent()+extentDiff);
  245.     SetOrigin(GetOrigin());
  246.     VObject::Control(id, part, this);         // change from outside
  247.     return;
  248.     }
  249.     VObject::Control(id, part, val);
  250. }
  251.  
  252. void StretchWrapper::SendDown(int id, int part, void *val)
  253. {
  254.     switch (part) {
  255.     case cPartEnableLayoutCntl:
  256.     interior->SetFlag(eVObjLayoutCntl);
  257.     break;
  258.     case cPartFocusChanged:
  259.     kbdFocus= !kbdFocus;
  260.     ForceRedraw();
  261.     CompositeVObject::SendDown(id, part, val);
  262.     break;
  263.     default:
  264.     CompositeVObject::SendDown(id, part, val);
  265.     }    
  266. }
  267.  
  268. void StretchWrapper::Draw(Rectangle r)
  269. {
  270.     CompositeVObject::Draw(r);
  271.     if (kbdFocus) {
  272.     GrSetPenNormal();
  273.     GrSetPenPattern(ePatGrey50);
  274.     GrSetPenSize(2);
  275.     GrStrokeRect(ContentRect());
  276.     GrPaintRect(Rectangle(ContentRect().SE()-gPoint4, gPoint4), ePatBlack);
  277.     }
  278. }
  279.  
  280. GrCursor StretchWrapper::GetCursor(Point p)
  281. {
  282.     Rectangle r(ContentRect().SE()-gPoint8, gPoint8);
  283.     
  284.     if (r.ContainsPoint(p)) 
  285.     return eCrsMoveStretch;
  286.     else
  287.     return VObject::GetCursor(p);
  288. }
  289.  
  290. int StretchWrapper::Base()
  291. {
  292.     return interior->Base()+border.y;
  293. }
  294.  
  295. ostream& StretchWrapper::PrintOn(ostream &s)
  296. {
  297.     CompositeVObject::PrintOn(s);
  298.     return s << border SP << interiorOffset SP << extentDiff SP << interior SP;
  299. }
  300.  
  301. istream& StretchWrapper::ReadFrom(istream &s)
  302. {
  303.     CompositeVObject::ReadFrom(s);
  304.     s >> border >> interiorOffset >> extentDiff >> interior;
  305.     if (interior->IsKindOf(View))
  306.     ((View*)interior)->SetNextHandler(this);
  307.     return s;
  308. }
  309.